home *** CD-ROM | disk | FTP | other *** search
Text File | 1998-05-08 | 13.9 KB | 495 lines | [TEXT/CWIE] |
- // Program Author: Paul Baxter
- // pbaxter@assistivetech.com
- //
- //
- // -----------------------------------------------------------------------
- // Utility Routines for getting/Putting data from/to AEDesc's
- // -----------------------------------------------------------------------
-
- #include "aeutils.h"
-
-
- // * ****************************************************************************** *
- // * GetRawDataFromDescriptor
- // * gets data in raw byte from Descriptor
- // * ****************************************************************************** *
- void GetRawDataFromDescriptor(const AEDesc *theDesc, Ptr destPtr, Size destMaxSize, Size *actSize)
- {
- Size copySize;
-
- if (theDesc->dataHandle) {
- HLock((Handle)theDesc->dataHandle);
- *actSize = GetHandleSize((Handle)theDesc->dataHandle);
-
- copySize = LesserOf(*actSize, destMaxSize);
-
- BlockMove(*theDesc->dataHandle, destPtr, copySize);
-
- HUnlock((Handle)theDesc->dataHandle);
- }
- else
- *actSize = 0;
- } /*GetRawDataFromDescriptor*/
-
-
- // * ****************************************************************************** *
- // * PutBooleanToDescriptor
- // * puts a Boolean into a Descriptor
- // * ****************************************************************************** *
- OSErr PutBooleanToDescriptor(AEDesc* aDesc, Boolean val)
- {
- OSErr err;
-
- if (! aDesc)
- return(errAETypeError);
-
- err = AECreateDesc(typeBoolean, (Ptr)&val, sizeof(val), aDesc);
- return(err);
- }
-
- // * ****************************************************************************** *
- // * GetBooleanFromDescriptor
- // * gets a Boolean from a Descriptor
- // * ****************************************************************************** *
- OSErr GetBooleanFromDescriptor(const AEDesc *sourceDesc, Boolean *result)
- {
- OSErr myErr;
- OSErr ignoreErr;
- Size boolSize;
- AEDesc resultDesc;
-
- *result = false;
- myErr = AECoerceDesc(sourceDesc,typeBoolean,&resultDesc);
-
- if (myErr==noErr) {
- GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Boolean), &boolSize);
- if (boolSize>sizeof(Boolean))
- myErr = errAECoercionFail;
- }
-
- if (resultDesc.dataHandle)
- ignoreErr = AEDisposeDesc(&resultDesc);
-
- return(myErr);
- }
-
- // * ****************************************************************************** *
- // * PutIntegerToDescriptor
- // * puts a short into a Descriptor
- // * ****************************************************************************** *
- OSErr PutIntegerToDescriptor(AEDesc* aDesc, short val)
- {
- OSErr err;
-
- if (! aDesc)
- return(errAETypeError);
-
- err = AECreateDesc(typeShortInteger, (Ptr)&val, sizeof(val), aDesc);
- return(err);
- }
-
- // * ****************************************************************************** *
- // * GetIntegerFromDescriptor
- // * gets a short from a Descriptor
- // * ****************************************************************************** *
- OSErr GetIntegerFromDescriptor(const AEDesc *sourceDesc, short *result)
- {
- OSErr myErr;
- OSErr ignoreErr;
- Size intSize;
- AEDesc resultDesc;
-
- *result = 0;
- myErr = AECoerceDesc(sourceDesc,typeShortInteger,&resultDesc);
-
- if (myErr==noErr) {
- GetRawDataFromDescriptor(&resultDesc, (Ptr)result, 2, &intSize);
- if (intSize>2)
- myErr = errAECoercionFail;
- }
-
- if (resultDesc.dataHandle)
- ignoreErr = AEDisposeDesc(&resultDesc);
-
- return(myErr);
- }
-
- // * ****************************************************************************** *
- // * PutLongIntToDescriptor
- // * puts a long into a Descriptor
- // * ****************************************************************************** *
- OSErr PutLongIntToDescriptor(AEDesc* aDesc, long val)
- {
- OSErr err;
-
- if (! aDesc)
- return(errAETypeError);
-
- err = AECreateDesc(typeLongInteger, (Ptr)&val, sizeof(val), aDesc);
- return(err);
- }
-
- // * ****************************************************************************** *
- // * GetLongIntFromDescriptor
- // * gets a long from a Descriptor
- // * ****************************************************************************** *
- OSErr GetLongIntFromDescriptor(const AEDesc *sourceDesc, long *result)
- {
- OSErr myErr;
- OSErr ignoreErr;
- Size intSize;
- AEDesc resultDesc;
-
- *result = 0;
- myErr = AECoerceDesc(sourceDesc,typeLongInteger,&resultDesc);
-
- if (myErr==noErr)
- {
- GetRawDataFromDescriptor(&resultDesc, (Ptr)result, 4, &intSize);
- if (intSize>4)
- myErr = errAECoercionFail;
- }
-
- if (resultDesc.dataHandle)
- ignoreErr = AEDisposeDesc(&resultDesc);
-
- return(myErr);
- } /*GetLongIntFromDescriptor*/
-
-
-
- // * ****************************************************************************** *
- // * PutHandleToDescriptor
- // * puts handles data to a Descriptor for a named type
- // * ****************************************************************************** *
- OSErr PutHandleToDescriptor(AEDesc* aDesc, Handle thedata, long theType)
- {
- OSErr err;
- char state;
-
- if (! aDesc)
- return(errAETypeError);
-
- state = HGetState(thedata);
- HLock((Handle)thedata);
- err = AECreateDesc(theType, (Ptr)*(thedata), GetHandleSize(thedata), aDesc);
- HSetState(thedata, state);
- return err;
- }
-
- // * ****************************************************************************** *
- // * GetHandleFromDescriptor
- // * gets handles data from a Descriptor for a named type
- // * ****************************************************************************** *
- OSErr GetHandleFromDescriptor(const AEDesc* sourceDesc, Handle resultHandle, long theType)
- {
- AEDesc resultDesc;
- OSErr myErr;
- OSErr ignoreErr;
- Size resultsize, actSize;
- char state;
-
- myErr = AECoerceDesc(sourceDesc,theType,&resultDesc);
-
- if (myErr==noErr) {
- actSize = GetHandleSize((Handle)sourceDesc->dataHandle);
- state = HGetState(resultHandle);
- HUnlock(resultHandle);
- SetHandleSize(resultHandle, actSize);
- HLock(resultHandle);
- GetRawDataFromDescriptor(&resultDesc, *resultHandle, actSize, &resultsize);
- HSetState(resultHandle, state);
- if (actSize!=resultsize)
- myErr = errAECoercionFail;
- }
-
- if (resultDesc.dataHandle)
- ignoreErr = AEDisposeDesc(&resultDesc);
-
- return myErr;
- }
-
- // * ****************************************************************************** *
- // * PutRectToDescriptor
- // * puts a Rectangle into a Descriptor
- // * ****************************************************************************** *
- OSErr PutRectToDescriptor(AEDesc* aDesc, Rect theRect)
- {
- OSErr err;
-
- if (! aDesc)
- return(errAETypeError);
-
- err = AECreateDesc(typeQDRectangle, (Ptr)&theRect, sizeof(theRect), aDesc);
- return err;
- }
-
- // * ****************************************************************************** *
- // * GetRectFromDescriptor
- // * gets a Rectangle from a Descriptor
- // * ****************************************************************************** *
- OSErr GetRectFromDescriptor(const AEDesc *sourceDesc, Rect *result)
- {
- OSErr myErr;
- OSErr ignoreErr;
- Size rectSize;
- AEDesc resultDesc;
-
- SetRect(result,0,0,0,0);
- myErr = AECoerceDesc(sourceDesc,typeQDRectangle,&resultDesc);
-
- if (myErr==noErr) {
- GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Rect), &rectSize);
- if (rectSize<sizeof(Rect))
- myErr = errAECoercionFail;
- }
-
- if (resultDesc.dataHandle)
- ignoreErr = AEDisposeDesc(&resultDesc);
-
- return(myErr);
- } /*GetRectFromDescriptor*/
-
-
- // * ****************************************************************************** *
- // * PutPStringToDescriptor
- // * puts a pascal string into a Descriptor
- // * ****************************************************************************** *
- OSErr PutPStringToDescriptor(AEDesc* aDesc, StringPtr pStr)
- {
- OSErr err;
-
- if (! aDesc || ! pStr)
- return(errAETypeError);
-
- err = AECreateDesc(typeChar, (Ptr)&pStr[1], pStr[0], aDesc);
-
- return(err);
- }
-
- // * ****************************************************************************** *
- // * GetPStringFromDescriptor
- // * gets a pascal string from a Descriptor
- // * ****************************************************************************** *
- OSErr GetPStringFromDescriptor(const AEDesc *aDesc, StringPtr resultStr)
- {
- Size stringSize;
- AEDesc resultDesc = {typeNull, NULL};
- OSErr err;
-
- err = AECoerceDesc(aDesc, typeChar, &resultDesc);
- if (noErr != err) goto done;
-
- resultStr[0] = 0;
-
- GetRawDataFromDescriptor(&resultDesc, (Ptr)&resultStr[1], 255, &stringSize);
- if (stringSize <= 255)
- resultStr[0] = stringSize;
- else
- err = errAECoercionFail;
-
- done:
- if (resultDesc.dataHandle)
- AEDisposeDesc(&resultDesc);
-
- return(err);
- }
-
- // * ****************************************************************************** *
- // * PutPointToDescriptor
- // * puts a Point into a Descriptor
- // * ****************************************************************************** *
- OSErr PutPointToDescriptor(AEDesc *aDesc, Point pt)
- {
- OSErr err;
-
- if (! aDesc)
- return(errAETypeError);
-
- err= AECreateDesc(typeQDPoint, (Ptr)&pt, sizeof(pt), aDesc);
- return err;
- }
-
- // * ****************************************************************************** *
- // * GetPointFromDescriptor
- // * gets a Point from a Descriptor
- // * ****************************************************************************** *
- OSErr GetPointFromDescriptor(const AEDesc *sourceDesc, Point *result)
- {
- OSErr myErr;
- OSErr ignoreErr;
- Size ptSize;
- AEDesc resultDesc;
-
- SetPt(result,0,0);
-
- myErr = AECoerceDesc(sourceDesc,typeQDPoint,&resultDesc);
-
- if (myErr==noErr) {
- GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(Point), &ptSize);
-
- if (ptSize<sizeof(Point))
- myErr = errAECoercionFail;
- }
-
- if (resultDesc.dataHandle)
- ignoreErr = AEDisposeDesc(&resultDesc);
-
- return(myErr);
- } /*GetPointFromDescriptor*/
-
-
- // * ****************************************************************************** *
- // * PutEnumeratedToDescriptor
- // * puts an enum (unsigned long) into a Descriptor
- // * ****************************************************************************** *
- OSErr PutEnumeratedToDescriptor(AEDesc* aDesc, unsigned long enumval)
- {
- OSErr err;
-
- if (! aDesc)
- return(errAETypeError);
-
- err = AECreateDesc(typeEnumerated, (Ptr)&enumval, sizeof(enumval), aDesc);
-
- return(err);
- }
-
- // * ****************************************************************************** *
- // * GetEnumeratedFromDescriptor
- // * gets an enum from a Descriptor
- // * ****************************************************************************** *
- OSErr GetEnumeratedFromDescriptor(const AEDesc *sourceDesc, DescType *result)
- {
- OSErr myErr;
- OSErr ignoreErr;
- Size enumSize;
- AEDesc resultDesc;
-
- *result = typeNull;
- myErr = AECoerceDesc(sourceDesc,typeEnumerated,&resultDesc);
-
- if (myErr==noErr) {
- GetRawDataFromDescriptor(&resultDesc, (Ptr)result, sizeof(DescType), &enumSize);
-
- if (enumSize<sizeof(DescType))
- myErr = errAECoercionFail;
- }
-
- if (resultDesc.dataHandle)
- ignoreErr = AEDisposeDesc(&resultDesc);
-
- return(myErr);
- } // GetEnumeratedFromDescriptor
-
-
- // * ****************************************************************************** *
- // * GotRequiredParams
- // * Checks all parameters defined as 'required' have been read
- // * ****************************************************************************** *
- OSErr GotRequiredParams(const AppleEvent *theAppleEvent)
- {
- DescType returnedType;
- Size actualSize;
- OSErr err;
-
- // look for the keyMissedKeywordAttr, just to see if it's there
-
- err = AEGetAttributePtr(theAppleEvent, keyMissedKeywordAttr, typeWildCard,
- &returnedType, NULL, 0, &actualSize);
-
- switch (err) {
- case errAEDescNotFound: // attribute not there means we
- err = noErr; // got all required parameters.
- break;
-
- case noErr: // attribute there means missed
- err = errAEParamMissed; // at least one parameter.
- break;
-
- // default: pass on unexpected error in looking for the attribute
- }
-
- return(err);
- } // GotReqiredParams
-
-
- // * ****************************************************************************** *
- // * AddResultToReply
- // * This routine takes a result descriptor, a reply descriptor and an error.
- // * If there is a result to add to the reply it makes sure the reply isn't
- // * NULL itself then adds the result to the reply depending on the error
- // * and the type of result.
- // * ****************************************************************************** *
- OSErr AddResultToReply(AEDesc* result, AEDesc* reply, OSErr error)
- {
- OSErr err;
-
- // Check that the reply is not NULL and there is a result to put in it
- if (typeNull == reply->descriptorType || typeNull == result->descriptorType)
- return(error);
-
- if (noErr == error)
- err = AEPutParamDesc(reply, keyDirectObject, result);
- else {
- switch (result->descriptorType) {
- case typeInteger:
- err = AEPutParamDesc(reply, keyErrorNumber, result);
- break;
-
- case typeChar:
- err = AEPutParamDesc(reply, keyErrorString, result);
- break;
-
- default:
- err = errAETypeError;
- }
-
- if (noErr == err)
- err = error; // Don't loose that error
- }
-
- return(err);
- }
-
- // * ****************************************************************************** *
- // * MakeSelfAddress
- // * Builds an AEAddressDesc for the current process.
- // * ****************************************************************************** *
- OSErr MakeSelfAddress(AEAddressDesc *selfAddress)
- {
- ProcessSerialNumber procSerNum;
-
- procSerNum.highLongOfPSN = 0;
- procSerNum.lowLongOfPSN = kCurrentProcess;
-
- return(AECreateDesc(typeProcessSerialNumber, (Ptr)&procSerNum, sizeof(procSerNum), selfAddress));
- } // MakeSelfAddress
-
-
- // * ****************************************************************************** *
- // * LesserOf
- // * Returns the Lesser of two longints.
- // * ****************************************************************************** *
- pascal long LesserOf(long A, long B)
- {
- if (A<B)
- return(A);
- else
- return(B);
- } /*LesserOf*/
-
-
- // * ****************************************************************************** *
- // * GreaterOf
- // * Returns the greater of two longints.
- // * ****************************************************************************** *
- pascal long GreaterOf(long A, long B)
- {
- if (A>B)
- return(A);
- else
- return(B);
- } /*GreaterOf*/
-
-